/*********************************************************************************
  *Copyright(C) Eric
  *FileName:  witgpio.c
  *Author:  github.com/erickkaa
  *Version:  V1.0.0
  *Date:  2022-05-04
  *Description:  用于便捷控制LED/Beep的gpio常亮、常灭、亮指定时长、亮灭指定次数且各自持续指定时长。  
**********************************************************************************/
#include <stdio.h>
#include "witgpio.h"


WitGpio_t witio[MAX_WITGPIO]={0};

uint32_t WitGpio_gettick()
{
	//  return your systick
	return HAL_GetTick();
}

void WitGpio_on(WITGPIO n)
{
 switch(n)
 {
 case BEEP:
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
	break;
 case LED_RED:
	 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
	break;
 case LED_GREEN:
	 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	break;
 case LED_BLUE:
	 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
	break;
	default:;
 }
}
void WitGpio_off(WITGPIO n)
{
 switch(n)
 {
 case BEEP:
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
	break;
 case LED_RED:
	 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
	break;
 case LED_GREEN:
	 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
	break;
 case LED_BLUE:
	 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
	break;
	default:;
 }
}
/*
WitGpio_contrl(BEEP,DIRECT_ON,0,0,0);//立即常亮
WitGpio_contrl(LED_R,DIRECT_OFF,0,0,0);//立即常灭
WitGpio_contrl(LED_G,HOLD_ON,3000,0,0);//亮3000ms
WitGpio_contrl(LED_B,BLINK,100,900,3);//亮100ms，灭900ms，循环3次
WitGpio_contrl(LED_WARNING,BLINK,200,600,0xff);//亮200ms，灭600ms，一直保持，除非再次更改为其他状态或关闭
*/
void WitGpio_contrl(WITGPIO n,WITGPIO_CMD cmd,uint32_t time_on,uint32_t time_off,uint8_t cnt)
{
	//printf("%s %d %d\r\n",__FUNCTION__,n,cmd);
	witio[n].cmd		=cmd;
	witio[n].time_on    =time_on; 
	witio[n].time_off   =time_off;
	witio[n].cnt       =cnt;  
}
void WitGpio_task()
{
	WITGPIO n;
	for(n=BEEP;n<MAX_WITGPIO;n++)
	{
		if(ISOFF!=witio[n].cmd)
		{
			switch(witio[n].cmd)
			{
			 case DIRECT_ON:
				WitGpio_on(n);
				break;
			 case DIRECT_OFF:
				WitGpio_off(n);
				break;
			 case HOLD_ON:
				 if(0==witio[n].tick_start_on)
				 {
					WitGpio_on(n);
					witio[n].tick_start_on=WitGpio_gettick();
				 }
				 else
				 {
					if(WitGpio_gettick()-witio[n].tick_start_on>witio[n].time_on)
					{
						WitGpio_off(n);
						witio[n].tick_start_on=0;
						witio[n].cmd=ISOFF;
					}
				 }
				break;
			 case BLINK:
				if(0==witio[n].tick_start_on)
				 {
					WitGpio_on(n);
					witio[n].tick_start_on=WitGpio_gettick();
					witio[n].tick_start_off=0;
				 }
				 else
				 {
					if((0==witio[n].tick_start_off)&&(WitGpio_gettick()-witio[n].tick_start_on>witio[n].time_on))
					{
						WitGpio_off(n);
						witio[n].tick_start_off=WitGpio_gettick();
					}
				 }
				 if((0!=witio[n].tick_start_off)&&(WitGpio_gettick()-witio[n].tick_start_off>witio[n].time_off))
				 {
					witio[n].tick_start_on=0;
					witio[n].tick_start_off=0;
					if(witio[n].cnt>1)
					{
						witio[n].cnt--;
					}
					else
					{
						witio[n].cmd=ISOFF;
						witio[n].cnt_over++;
					}
				 }
				break;
			default:;
			}
		}
	}
}

uint8_t Get_WitGpio_cnt_over(WITGPIO n)
{
	return witio[n].cnt_over;
}

